extends CanvasLayer
class_name MainMenu

# ======================================================
# 主菜单界面控制器
# 处理游戏启动流程和界面交互
# ======================================================

#region 节点引用
# ------------------------------------------------------
# 继续游戏按钮（通过路径获取）
@onready var continue_btn: Button = $MenuButtons/ContinueBtn


#endregion

#region 生命周期回调
# ------------------------------------------------------
func _ready():
	# 初始化界面状态
	update_continue_button_visibility()

	# 连接存档事件监听（当游戏保存时更新按钮状态）
	GlobalSignal.gs_game_saved.connect(update_continue_button_visibility)


#endregion

#region 按钮事件处理
# ------------------------------------------------------
# 开始新游戏按钮点击
func _on_StartNewGame_pressed():
	new_game()


# 继续游戏按钮点击
func _on_Continue_pressed():
	load_game()
	GlobalSignal.gs_game_loaded.emit() # 通知全局系统游戏加载完成


# 设置按钮点击（当前未实现）
func _on_Settings_pressed():
	#var settings = preload("res://game/01_scenes/ui/settings_menu.tscn").instantiate()
	#add_child(settings)
	pass # 预留设置菜单接口


# 退出游戏按钮点击
func _on_Quit_pressed():
	get_tree().quit() # 关闭游戏进程


#endregion

#region 游戏流程控制
# ------------------------------------------------------
# 更新继续按钮可见性（根据存档存在状态）
func update_continue_button_visibility():
	# 从游戏管理器获取存档状态
	continue_btn.visible = GameManager.has_save()


# 初始化新游戏流程
func new_game():
	# 生成高精度随机种子（8位数字）
	var temp_rng = RandomNumberGenerator.new()
	temp_rng.randomize()
	var seed_value = temp_rng.randi_range(10_000_000, 99_999_999)

	# 重置游戏数据
	GameData.reset()
	GameManager.rng.initialize(seed_value) # 初始化随机系统

	# 发送全局初始化信号
	GlobalSignal.gs_game_initialized.emit()

	# 跳转到指挥官选择场景
	get_tree().change_scene_to_file("res://game/01_scenes/interface/race_select/race_select.tscn")


# 加载游戏存档流程
func load_game():
	# 存档文件不存在时回退到新游戏
	if not FileAccess.file_exists(GameConstant.SAVE_PATH):
		push_warning("存档文件不存在，创建新游戏")
		new_game()
		return

	# 尝试读取存档文件
	var file = FileAccess.open(GameConstant.SAVE_PATH, FileAccess.READ)
	if not file:
		var error_code = FileAccess.get_open_error()
		push_error("读取存档失败，错误码：%d" % error_code)
		return

	# 解析JSON数据
	var json = JSON.new()
	var parse_result = json.parse(file.get_as_text())
	if parse_result != OK:
		push_error("JSON解析错误：%s" % json.get_error_message())
		return
	
	var save_data = json.data # 获取解析后的数据字典
	var game_data = save_data.get("game_data", {})
	# 加载军队数据（如果存在）
	if game_data.has("army_data"):
		GameData.army_data.from_dict(game_data["army_data"])
	else:
		push_warning("存档中未找到军队数据")

	# 加载关卡进度（如果存在）
	if game_data.has("level_data"):
		GameData.level_data.from_dict(game_data["level_data"])
	else:
		push_warning("存档中未找到关卡数据")

	if game_data.has("unlocked_troop_types"):
		GameData.unlocked_troop_types = game_data["unlocked_troop_types"]

	# 恢复随机数生成器状态
	var rng_state = save_data.get("rng_state", {})
	if not rng_state.is_empty():
		GameManager.rng.restore_state(rng_state)
	else:
		push_warning("存档中未找到随机数状态")
		#endregion
	get_tree().change_scene_to_file("res://game/01_scenes/interface/army_deployment/army_deployment.tscn")
